iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
1

基本上在建立webserver時,都會考慮到這個服務會給誰使用,會有多少人使用,
因此在建立好服務後,開放出去使用前,都必須要先測試看看,
看能不能容納預想的人數,以及考慮最大可能人數,不然服務一開出去就給使用者打爆,
客戶的信心就會下降,工程師也得上來一直處理問題,因此對於服務的壓力測試是必要的。
通常壓力測試有兩種,一種是針對該函數跑Benchmark測試,一個是將服務架起來後,
透過外部程式來打api,測試服務處理速度,這邊主要介紹第二個。

vegeta

當我們服務架設起來後,預設會開放/get_user_data(GET)這個api去讓使用者呼叫,
這時有個外部壓測程式可以方便我們測試呼叫api,這個程式就是vegeta
要安裝vegeta,這邊以mac來舉例:

brew update && brew install vegeta

用brew就可以輕易安裝,而要使用vegeta去跑壓力測試,有兩種方法。

指令

一個是安裝後,透過vegeta + 參數的方式:

echo 'GET http://127.0.0.1/get_user_data' | vegeta attack -rate=10 -duration=10s | vegeta report -output="report.txt"

輸入vegeta attack 後,可以指定參數,以上面範例來說,就是每秒10次,持續五秒的方式來呼叫該api,
並將測試報告會出去report.txt
或是你也可以將指令寫到檔案內,再透過target去呼叫,舉例來說,建立一個targets.txt,內容如下

GET http://127.0.0.1/get_user_data

這時再下指令:

./vegeta attack -rate=10 -duration=10s -targets=targets.txt| vegeta report -output="report.txt"

這樣他就會做到跟前面範例一樣的行為了。

套件

除了直接執行,vegeta也可以以套件的方式來進行測試,引用方式如下:

import(
    vegeta "github.com/tsenart/vegeta/v12/lib"
)

使用方式則是像下面範例:

    rate := vegeta.Rate{Freq: 10, Per: time.Second}
	duration := 10 * time.Second
	targeter := vegeta.NewStaticTargeter(vegeta.Target{
		Method: "GET",
		URL:    "http://127.0.0.1/get_user_data",
	})
	attacker := vegeta.NewAttacker()

	var metrics vegeta.Metrics
	for res := range attacker.Attack(targeter, rate, duration, "Big Bang!") {
		metrics.Add(res)
	}
	metrics.Close()

要看測試後的報告,則是要從metrics內呼叫出來:

	fmt.Println("metrics.Latencies.Max", metrics.Latencies.Max)
	fmt.Println("metrics.Latencies.Mean", metrics.Latencies.Mean)
	fmt.Println("metrics.Latencies.Min", metrics.Latencies.Min)
	fmt.Println("metrics.StatusCodes", metrics.StatusCodes)

以這個方式,就可以用套件方式使用vegeta。
介紹完了上面兩種方式,你就可以選擇你所喜歡的方法來進行壓力測試了。


上一篇
Day24- http打其他服務:Greq
下一篇
Day26-單元測試
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言